#!/bin/bash

###############################################
# 子网设备自动发现脚本
# 名称：discover_subnet_devices.sh
# 版本：1.0
# 作者：资深程序员
# 日期：2025-03-23
# 描述：
#   自动扫描指定子网，发现存活设备和开放端口，
#   帮助管理员快速掌握网络中的活跃设备和服务状态。
###############################################

# 获取脚本所在目录
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
LOG_FILE="$SCRIPT_DIR/subnet_discovery.log"

# 记录日志
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 检查并安装依赖
check_install() {
    local tool="$1"
    if ! command -v "$tool" &> /dev/null; then
        log "工具 $tool 未安装，正在安装..."
        sudo apt-get update && sudo apt-get install -y "$tool"
    fi
}

# 扫描子网设备和开放端口
scan_subnet() {
    local subnet="$1"
    log "开始扫描子网：$subnet"
    sudo nmap -sP -oG - "$subnet" | grep "Status: Up" | awk '{print $2}' > "$SCRIPT_DIR/alive_hosts.txt"
    log "存活设备列表："
    cat "$SCRIPT_DIR/alive_hosts.txt" | tee -a "$LOG_FILE"

    while IFS= read -r ip; do
        log "扫描设备 $ip 的开放端口..."
        sudo nmap -sS -p- "$ip" | grep "open" | tee -a "$LOG_FILE"
        echo "---------------------------------" | tee -a "$LOG_FILE"
    done < "$SCRIPT_DIR/alive_hosts.txt"
}

# 主程序入口
main() {
    log "子网设备自动发现脚本启动..."
    check_install "nmap"

    # 自动获取子网信息
    subnet=$(ip -4 route show default | grep -oP 'src \K[0-9.]+/24')
    if [[ -z "$subnet" ]]; then
        log "无法自动获取子网，请手动输入子网范围（如192.168.1.0/24）："
        read -r subnet
    fi

    scan_subnet "$subnet"
    log "子网设备自动发现脚本执行完毕。"
}

main "$@"
